﻿/*
*jquery.util.js
*版本：1.0
*最后时间：2015-11-19
*基于 jQuery 1.9.x 
*作者：张海山
*联系qq：136533295
*说明：js公共类库封装。
*目前有常见的 字符串扩展 和 日期类型扩展
*http://www.cnblogs.com/zhanghaishan/p/4980402.html
*/

//公共类库
;
var jutil = (function (window, doucment, $, undefined) {
    var self = this;
    self.version = "1.0.0.0";
    self.author = "张海山";
    self.lastModifyDate = "2015-11-19";
    // 比较两个值是否相等，不等则抛出异常
    self.areEqual = function (val1, val2) {
        if (val1 !== val2)
            throw "期望值和比较值不相等";
        return true;
    };
    return { areEqual: self.areEqual };
})(window, document, jQuery, undefined);
 
/*=========================================*/
/*============对string 类型原型扩展================*/
/*=========================================*/
$.extend(String.prototype, {
    //支持字符串 format 方法
    format: function() {
        var args = arguments;
        return this.replace(/\{(\d+)\}/g,
            function(m, i) {
                return args[i];
            });
    },
    //判断字符串是否为Null或者为空字符串。
    //为 空 则返回 true，否则返回false
    isNullOrEmpty: function() {
        return this === undefined || this === null || this == "";
    },
    //判断字符串是否为Null或者为空字符串或者全是空格。
    //为 空 或者全部是空格 则返回 true，否则返回false
    isNullOrWhiteSpace: function() {
        return this.isNullOrEmpty() || this.trim().isNullOrEmpty();
    },
    //判断字符串是否包含指定的内容。val :指定内容
    //包含指定内容， 则返回 true，否则返回false
    isContains: function(val) {
        return this.indexOf(val) > -1;
    },
    //返回字符串，返回反转后副本，并不改变原有的字符串。
    reverse: function() {
        var chars = [];
        for (var i = this.length - 1; i > -1; i--) {
            chars.push(this[i]);
        }
        return chars.join("");
    },
    //去除字符串左边的空格，返回处理后副本，并不改变原有的字符串。
    ltrim: function() {
        return this.replace(/(^\s*)/g, "");
    },
    //去除字符串右边的空格，返回处理后副本，并不改变原有的字符串。
    rtrim: function() {
        return this.replace(/(\s*$)/g, "");
    },
    //判断字符串是否以指定内容开头
    //以指定内容开头， 则返回 true，否则返回false
    startsWith: function() {
        return this.substr(0, arguments[0].length) == arguments[0];
    },
    //判断字符串是否以指定内容结尾
    //以指定内容结尾， 则返回 true，否则返回false
    endWith: function() {
        return this.substr(this.length - arguments[0].length) == arguments[0];
    },
    //判断字符串是否是长日期，例如：2015-11-19 23:00:26。
    //是 长日期， 则返回 true，否则返回false
    isLongDate: function() {
        var r = this.replace(/(^\s*)|(\s*$)/g, "").match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/);
        if (r == null) { return false; }
        var d = new Date(r[1], r[3] - 1, r[4], r[5], r[6], r[7]);
        return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4] && d.getHours() == r[5] && d.getMinutes() == r[6] && d.getSeconds() == r[7]);
    },
    //判断字符串是否是短日期，例如：2015-11-19。
    //是 短日期， 则返回 true，否则返回false
    isShortDate: function() {
        var r = this.replace(/(^\s*)|(\s*$)/g, "").match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
        if (r == null) { return false; }
        var d = new Date(r[1], r[3] - 1, r[4]);
        return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]);
    },
    //判断字符串是否是日期，例如：2015-11-19。
    //是 日期， 则返回 true，否则返回false
    isDate: function() {
        return this.isShortDate() || this.isLongDate();
    },
    //判断字符串是否是电话/传真号码
    //是 电话/传真号码， 则返回 true，否则返回false
    isTelOrFax: function() {
        return this.isNullOrEmpty() ? false : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/i.test(this);
    },
    //判断字符串是否是手机号码
    //是 手机号码， 则返回 true，否则返回false
    isMobile: function() {
        return this.isNullOrEmpty() ? false : /^1([3-9])\d{9}$/i.test(this);// modified by  wq on 20180531
    },
    //判断字符串是否是电子邮箱
    //是 手机号码， 则返回 true，否则返回false
    isEmail: function() {
        return this.isNullOrEmpty() ? false : /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(this);
    },
    //判断字符串是否是邮编
    //是 邮编， 则返回 true，否则返回false
    isZip: function() {
        return this.isNullOrEmpty() ? false : /^[\d]{6}$/.test(this);
    },
    isQQ: function() {
        return this.isNullOrEmpty() ? false : /^[1-9]\d{5,11}$/i.test(this);
    },
    //判断字符串是否存在汉字。
    //存在汉字， 则返回 true，否则返回false
    isExistChinese: function() {
        return this.isNullOrEmpty() ? false : !/^[\x00-\xff]*$/.test(this);
    },
    //判断字符串是否全是汉字。
    //全是汉字， 则返回 true，否则返回false
    isChinese: function() {
        return this.isNullOrEmpty() ? false : /^[\u0391-\uFFE5]+$/i.test(this);
    },
    //判断字符串是否全是字母。
    //全是字母， 则返回 true，否则返回false
    isAbc: function() {
        return this.isNullOrEmpty() ? false : /^[A-Za-z]+$/i.test(this);
    },
    //判断字符串是否全是数字。
    //全是数字， 则返回 true，否则返回false
    isDigit: function () {
        return this.isNullOrEmpty() ? false : /^[\d]+$/i.test(this);
    },
    //将字符串日期转换成日期类型
    //转换成功则返回对应的时间，失败则返回null
    toDate: function () {
        try { return new Date(this.replace(/-/g, "\/")); }
        catch (e) { return null; }
    },
    //将字符串转换成对应的bool值
    //转换成功则返回对应的bool值，失败则返回false
    toBool: function () {
        var str = this.isNullOrEmpty() ? false : this.toLowerCase();
        str = str.trim();
        return str == "true" || str == "yes" || str == "y" || str == "t" || str == "1" || str == "是";
    },
    //将字符串转换成对应的int
    //转换成功则返回对应的int，失败则返回0
    toInt: function () {
        return isNaN(parseInt(this)) ? 0 : parseInt(this);
    },
    //将字符串转换成对应的Double
    //转换成功则返回对应的Double，失败则返回0.0
    toDouble: function () {
        return isNaN(parseFloat(this)) ? 0.0 : parseFloat(this);
    },
    //将字符串转换成对应的Double
    //转换成功则返回对应的json，失败则返回null
    toJson: function () {
        try{return $.parseJSON(this);}
        catch (e) { return null; }
    }
});

/*=========================================*/
/*============对 Date 类型原型扩展================*/
/*=========================================*/
$.extend(Date.prototype, {
    // 将日期类型格式化为指定内容的字符串
    //例如：(new Date()).format('yyyy/MM/dd')  输出 2015/11/20
    format: function (fmt) {
        var o = {
            "M+": this.getMonth() + 1,
            "d+": this.getDate(),
            "h+": this.getHours() % 12 == 0 ? 12 : this.getHours() % 12,
            "H+": this.getHours(),
            "m+": this.getMinutes(),
            "s+": this.getSeconds(),
            "q+": Math.floor((this.getMonth() + 3) / 3),
            "S": this.getMilliseconds()
        };
        var week = {
            "0": "\u65e5",
            "1": "\u4e00",
            "2": "\u4e8c",
            "3": "\u4e09",
            "4": "\u56db",
            "5": "\u4e94",
            "6": "\u516d"
        };
        if (/(y+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        }
        if (/(E+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : "") + week[this.getDay() + ""]);
        }
        for (var k in o) {
            if (new RegExp("(" + k + ")").test(fmt)) {
                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            }
        }
        return fmt;
    },
    //日期类型支持add 方法
    //interval： 时间类型，分 时秒等，number 数值，可为负数
    add: function (interval, number) {
        switch (interval) {
            case 's':
                return new Date(Date.parse(this) + (1000 * number));
            case 'm':
                return new Date(Date.parse(this) + (60000 * number));
            case 'h':
                return new Date(Date.parse(this) + (3600000 * number));
            case 'd':
                return new Date(Date.parse(this) + (86400000 * number));
            case 'w':
                return new Date(Date.parse(this) + ((86400000 * 7) * number));
            case 'M':
                return new Date(this.getFullYear(), (this.getMonth()) + number, this.getDate());
            case 'q':
                return new Date(this.getFullYear(), (this.getMonth()) + number * 3, this.getDate());
            case 'y':
                return new Date((this.getFullYear() + number), this.getMonth(), this.getDate());
        }
        return this;
    },
    //日期类型支持addSecond 方法
    addSecond: function () {
        return this.Add("s", arguments[0]);
    },
    //日期类型支持addMinute 方法
    addMinute: function () {
        this.Add("m", arguments[0]);
    },
    //日期类型支持addHour 方法
    addHour: function () {
        this.Add("h", arguments[0]);
    },
    //日期类型支持addDay 方法
    addDay: function () {
        this.Add("d", arguments[0]);
    },
    //日期类型支持addWeek 方法
    addWeek: function () {
        this.Add("w", arguments[0]);
    },
    //日期类型支持addMonth 方法
    addMonth: function () {
        this.Add("M", arguments[0]);
    },
    //日期类型支持addQuarter 方法
    addQuarter: function () {
        this.Add("q", arguments[0]);
    },
    //日期类型支持addYear 方法
    addYear: function () {
        this.Add("y", arguments[0]);
    }
});
